2장. 거대 모델은 어떻게 만들어지나

출처: 『AI 엔지니어링』(Chip Huyen 지음) | 원서: AI Engineering (O'Reilly) — 본 입문판은 2장 PDF 원문에서 직접 풀어 썼다.

코드는 분위기만 — Python·수식·import 같은 말은 몰라도 됩니다. '비유'와 '위험'만 봐도 충분해요.

이 장은 "남이 만든 거대 모델, 그 안에서 무슨 결정들이 오갔길래 이 모델은 이걸 잘하고 저건 못 하는가"를 본다.

우리가 모델을 만들 일은 없다.

하지만 어떤 모델을 고를지 정하려면, 그 모델이 어떤 재료와 결정으로 빚어졌는지 대충은 알아야 한다.

천천히 읽으면 된다. 어려운 수식은 다 건너뛰어도 된다.


0. 이 장의 새 단어 (0장에 없는 말만 3개)

0장 용어집에 있는 말(파운데이션 모델·토큰·파인튜닝·환각 등)은 그대로 쓴다.

이 장에서 처음 나오는, 꼭 필요한 말 3개만 여기 풀어 둔다.


어텐션(attention)

한 문장 뜻 — 모델이 다음 말을 만들 때, 앞에 나온 단어들 중 어디를 얼마나 봐야 할지 정하는 장치.

일상비유 — 시험 볼 때 오픈북. 모든 페이지를 똑같이 보는 게 아니라, 지금 푸는 문제와 관련 깊은 페이지를 골라 더 집중해서 본다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 다음 단어를 고를 때 앞 단어마다 "집중도" 점수를 매김
focus = {"How": 0.1, "are": 0.2, "you": 0.7}  # you 에 가장 집중

온도(temperature)

한 문장 뜻 — 모델의 대답을 얼마나 뻔하게 vs 얼마나 엉뚱하게 만들지 정하는 손잡이 하나.

일상비유 — 주사위에 손대기. 온도가 낮으면 늘 같은 면이 나오게 눌러 둔 주사위(뻔함), 높으면 어떤 면이든 잘 나오는 공정한 주사위(엉뚱함).

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 온도 낮음 = 늘 가장 무난한 답 / 온도 높음 = 가끔 튀는 답
answer = model.ask("색깔 추천", temperature=0.2)  # 거의 매번 "파란색"

사후 학습(post-training)

한 문장 뜻 — 인터넷 글로 갓 학습을 마친 거친 모델을, 사람 말 잘 듣게 한 번 더 다듬는 단계.

일상비유 — 신입 재교육. 책은 많이 읽었지만 손님 응대는 엉망인 신입에게, 대화법과 회사 규칙을 따로 가르치는 것.

한 줄 예 —

# 1단계: 인터넷 글로 학습한 거친 모델 → 2단계: 사람 말 듣게 다듬기
# 답변을 생성할 LLM 클라이언트나 모델 설정을 준비합니다.
raw_model = pretrain(internet_text)
polite_model = post_train(raw_model)  # 대화·예의 추가

(귀납 도입) 이런 적 있죠?

같은 AI에게 한국어로 물으면 척척 답하는데, 잘 안 쓰는 언어로 물으면 갑자기 바보가 된다.

같은 질문을 두 번 했는데 답이 매번 다르다.

분명히 모르는 걸 모른다고 안 하고 술술 지어낸다.

이게 다 "이 모델이 어떻게 만들어졌는가"에서 나오는 현상이다.

모델은 마법 상자가 아니다.

어떤 글로 배웠고, 속을 어떻게 짰고, 어떻게 다듬었고, 답을 어떻게 고르는지 — 이 네 가지가 모든 걸 정한다.

이 장은 그 네 가지를 차례로 본다.


이 장에서 딱 4가지만

이 장의 큰 줄기 4개

  1. 무슨 글로 배웠나 (학습 데이터) — 모델은 배운 것만 한다. 인터넷에 영어가 절반이라, 모델도 영어를 제일 잘한다.
  2. 속을 어떻게 짰나 (아키텍처) — 요즘 모델 속은 거의 다 '트랜스포머'다. 핵심 장치는 어텐션 하나.
  3. 어떻게 다듬었나 (사후 학습) — 갓 배운 모델은 거칠다. 사람 말 듣게 한 번 더 가르친다.
  4. 답을 어떻게 고르나 (샘플링) — 모델은 다음 말을 확률로 뽑는다. 이 '뽑기'가 창의성도, 헛소리도 만든다.

각 줄기를 하나씩 본다.

지금은 4개 제목만 머리에 넣어도 된다.


1. 무슨 글로 배웠나 — 학습 데이터

1.1 모델은 배운 것만 한다

망가지는 장면

학습할 때 한국어를 한 줄도 안 본 모델에게 한국어 번역을 시킨다.

당연히 못 한다. 본 적이 없으니까.

동물 사진만 보고 자란 모델에게 식물 사진을 보여주면, 그것도 못 알아본다.

일상비유

요리사는 배운 요리만 한다.

한식만 배운 요리사에게 갑자기 정통 프랑스 코스를 시키면 흉내만 낼 뿐이다.

모델도 똑같다. 학습 데이터에 없던 일은 못 한다.

비유 코드 위험
한식만 배운 요리사 model.train(korean_only) 안 배운 언어·분야는 못 함
메뉴에 있는 것만 주문 가능 model.ask("한국어 번역") → 학습에 한국어 있어야 작동 "AI니까 다 되겠지" 착각

한 문장 정의 — 모델이 할 수 있는 일의 한계는 학습 데이터가 정한다. 안 배운 건 못 한다.

그래서 모델을 고르기 전, "이 모델이 무슨 글로 배웠나"를 보는 게 첫 단추다.


1.2 데이터는 어디서 오나 — 커먼 크롤

거대 모델 하나 학습시키려면 글이 어마어마하게 많이 필요하다.

그 많은 글을 어디서 구할까? 대부분 커먼 크롤(Common Crawl) 에서 온다. (0장 용어집 참고)

비영리 단체가 인터넷 웹페이지를 통째로 긁어 만든 거대한 글 더미다.

2022~2023년엔 매달 약 20~30억 개의 웹페이지를 긁었다.

구글은 이걸 한 번 거른 깨끗한 버전 C4 를 따로 만들었다.

여기서 망가지는 장면

커먼 크롤은 인터넷을 통째로 퍼 온 거라, 흙탕물도 같이 들어온다.

가짜 뉴스, 음모론, 혐오 글까지 다 섞여 있다.

워싱턴 포스트 조사로는, 가장 많이 긁힌 1,000개 사이트에 신뢰도 낮은 언론사가 여럿 끼어 있었다.

비유 코드 위험
강물 통째로 퍼 온 물탱크 data = common_crawl # 수십억 페이지 가짜 뉴스·혐오 글도 같이 학습됨
그냥 마시기 전에 한 번 거름 clean = C4 # 구글이 거른 버전 걸러도 흙탕물이 완전히 안 빠짐

그래서 일부 팀은 거름망(휴리스틱)을 쓴다.

오픈AI는 GPT-2 학습 때 레딧에서 추천 3개 이상 받은 글만 썼다. (그래도 완벽하진 않다.)


1.3 양보다 품질

흔한 착각

"글을 많이 먹일수록 똑똑해지겠지?"

꼭 그렇지 않다.

적은 양이라도 좋은 글로 배운 모델이, 많은 양의 허접한 글로 배운 모델을 이기기도 한다.

예시 폭격 ① (완성예)

구나세카르(Gunasekar) 연구(2023): 좋은 코딩 글 70억 토큰으로 배운 작은 모델(13억 파라미터)이, 훨씬 큰 모델들을 코딩 시험에서 이겼다.

작지만 좋은 재료로 배운 쪽이 이긴 것이다.

예시 폭격 ② (부분완성 — 빈칸 채우기)

# 빈칸: 어느 쪽이 더 좋은 모델일까?
# 모델을 조금 더 가르치거나 학습 설정을 준비합니다.
model_A = train(data="좋은 글 조금")
# 모델을 조금 더 가르치거나 학습 설정을 준비합니다.
model_B = train(data="허접한 글 잔뜩")
# 정답: 상황 따라 A 가 이길 수 있다 (양 != 품질)
비유 코드 위험
좋은 재료 적게 vs 허접한 재료 많이 train(few_good) vs train(many_bad) "많이 = 좋음" 단정은 틀림

한 문장 정의 — 데이터는 양만큼 품질이 중요하다. 좋은 글 적게가 허접한 글 많이를 이길 수 있다.


1.4 영어는 잘하고 다른 언어는 못한다 — 다국어 불균형

망가지는 장면

같은 AI인데, 영어로 물으면 똑똑하고 잘 안 쓰는 언어로 물으면 갑자기 멍청해진다.

왜? 인터넷 글의 절반이 영어라서 그렇다.

커먼 크롤을 분석했더니(Lai et al., 2023):

언어 인터넷 글 비중 한마디로
영어 45.88% 거의 절반. 압도적
러시아어 5.97% 2위인데도 영어의 8분의 1
독일어 5.88%
중국어 4.87% 쓰는 사람은 제일 많은데 글은 적음

데이터가 너무 적은 언어를 저자원 언어(low-resource language) 라고 부른다.

쓰는 사람은 많은데 인터넷 글은 턱없이 적은 언어들이다.

언어 쓰는 사람 인터넷 글 비중 사람 수 대비 글 부족
펀자브어 1.13억 명 0.0061% 231배 부족
스와힐리어 0.71억 명 0.0077% 115배 부족
벵골어 2.72억 명 0.0930% 37배 부족

그래서 무슨 일이 벌어지나 (예시 폭격)

예시 ① — GPT-4는 영어 시험(MMLU)은 잘 보지만, 텔루구어·펀자브어 같은 저자원 언어에선 점수가 뚝 떨어졌다.

예시 ② — 예니 준의 실험에서 GPT-4는 같은 수학 문제를 영어로 아르메니아어·페르시아어보다 3배 잘 풀었고, 버마어·암하라어로는 6문제 전부 틀렸다.

비유 코드 위험
모국어는 술술, 외국어는 더듬 ask("...", lang="en") 잘함 / lang="my") 못함 저자원 언어 서비스는 성능이 낮음

한 문장 정의 — 인터넷 글이 영어에 쏠려 있어, 모델도 영어를 제일 잘하고 데이터 적은 언어는 못한다.


1.5 그냥 영어로 번역해서 쓰면 안 되나? — 그리고 비용 함정

해보고 싶은 생각

"그럼 다른 언어 질문을 영어로 번역해서 묻고, 답을 다시 번역하면 되잖아?"

많이들 그렇게 하지만, 함정이 있다.

함정 ① — 번역 중에 정보가 샌다. 베트남어엔 상대와의 관계를 담은 호칭이 있는데, 영어로 바꾸면 다 Iyou가 되어 그 관계가 사라진다.

함정 ② — 언어마다 모델 행동이 다르다. 뉴스가드 조사(2023.4)에서 초기 챗GPT는 영어로는 거짓 정보 요청을 거의 거부했지만(7번 중 1번만 생성), 중국어로는 7번 모두 생성했다.

비용 함정 — 토큰화 효율

같은 뜻을 전해도 언어마다 토큰(레고 블록) 개수가 다르다.

언어 한 문장당 토큰 수 영어 대비
영어 7개 기준
힌디어 32개 약 4.5배
버마어 72개 약 10배

토큰이 10배면, 처리 시간도 약 10배, 토큰당 돈 받는 API에선 요금도 약 10배다.

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 같은 인사말인데 토큰 수가 다름 → 비용도 다름
cost_english = tokens(7)   # 싸고 빠름
cost_burmese = tokens(72)  # 약 10배 비싸고 느림

한 문장 정의 — 단순 영어 번역은 정보 손실과 언어별 행동 차이가 있고, 저자원 언어는 토큰이 많아 비용도 최대 10배 더 든다.


1.6 전문 분야 모델 — 도메인 특화

망가지는 장면

범용 모델(챗GPT 같은)은 코딩·법률·스포츠 등 웬만한 건 다 한다.

그런데 신약 개발이나 암 검사처럼 인터넷에 거의 없는 전문 데이터가 필요한 일은 못한다.

단백질·DNA 데이터, X선·MRI 영상은 인터넷에서 못 구하거나 개인정보라 막혀 있다.

그래서 전문 데이터로 따로 키운 모델들 (예시 폭격)

  • 딥마인드 알파폴드(AlphaFold) — 단백질 10만 개 구조로 배운 단백질 전문 모델
  • 엔비디아 바이오네모(BioNeMo) — 신약 개발용 생체분자 전문 모델
  • 구글 메드팜2(Med-PaLM 2) — 의료 질문 답변 전문 모델
  • 건축 스케치 모델 — 일반 그림 모델보다 건축가 작업을 훨씬 잘 도움
비유 코드 위험
만능 의사 vs 전문의 general.ask("단백질 구조?") 약함 / alphafold.ask(...) 강함 범용 모델은 전문 영역에서 약함

한 문장 정의 — 범용 모델이 못 닿는 전문 영역은, 그 분야 데이터로 따로 키운 도메인 특화 모델이 맡는다.


2. 속을 어떻게 짰나 — 트랜스포머

2.1 옛날 방식의 두 가지 답답함 (seq2seq)

망가지는 장면

트랜스포머 이전엔 seq2seq 라는 방식이 번역을 맡았다.

구조는 둘이다. 입력을 읽는 쪽(인코더)과 답을 쓰는 쪽(디코더).

그런데 답답한 점이 둘 있었다.

답답함 ① — 요약본만 보고 답함. 입력 문장 전체를 딱 하나의 '요약 메모'로 압축한 뒤, 답 쓰는 쪽은 그 메모만 본다. 긴 글일수록 정보가 샌다.

답답함 ② — 줄 서서 처리해 느림. 단어를 한 개씩 순서대로만 처리한다. 입력이 200단어면 200번 줄 서서 기다려야 한다.

비유 코드 위험
책 전체를 한 줄 요약만 보고 답함 summary = compress(book)answer(summary) 긴 입력에서 정보 손실 큼
한 명씩 줄 세워 처리 for word in input: process(word) 긴 글에서 느림

한 문장 정의 — 옛날 seq2seq는 입력을 요약 하나로 뭉쳐 정보를 잃었고, 한 개씩 줄 세워 처리해 느렸다.


2.2 어텐션이 두 답답함을 한 번에 푼다

해결 장면

트랜스포머는 어텐션(0장에 없던 말, 이 장 새 단어 참고) 하나로 두 답답함을 다 풀었다.

요약 메모만 보는 게 아니라, 답을 쓸 때마다 원본 페이지를 골라 본다.

그리고 단어를 줄 세우지 않고 한꺼번에(병렬) 처리한다.

어텐션은 세 가지 부품으로 돌아간다 (책 찾기 비유)

부품 역할 도서관 비유
Q (쿼리) 지금 내가 찾는 것 자료 찾으러 온 사람
K (키) 각 단어의 이름표 책의 색인(페이지 번호)
V (값) 각 단어의 실제 내용 그 페이지의 내용

찾는 사람(Q)이 색인(K)을 훑어 "이 페이지가 관련 깊네" 점수를 매기고, 점수 높은 페이지의 내용(V)을 더 많이 가져다 답을 만든다.

예시 폭격

예시 ① (완성예) — "How are you ?"를 번역할 때, 다음 단어를 만들며 모델은 네 단어 each에 집중도 점수를 매긴다.

# Q(찾는 중) 가 단어마다 집중도 점수를 매김
# 여러 값을 이름표가 붙은 구조로 묶어 전달합니다.
focus = {"How": 0.1, "are": 0.2, "you": 0.6, "?": 0.1}
# you 에 가장 집중 → 답에 "너" 관련 내용 더 반영

예시 ② (부분완성) — 빈칸: 어텐션 점수가 높은 단어는 답에 ___ 반영된다. 정답: 더 많이.

비유 코드 위험
오픈북 — 관련 페이지 골라 봄 score = match(Q, K)answer += score * V 단어 많을수록 봐야 할 색인도 늘어 무거워짐

한 문장 정의 — 어텐션은 답을 만들 때 앞 단어마다 집중도를 매겨(Q·K·V) 관련 깊은 곳을 골라 보게 하는 장치이며, 트랜스포머의 심장이다.


2.3 긴 글이 부담스러운 이유

어텐션엔 약점도 있다.

앞 단어마다 이름표(K)와 내용(V)을 다 들고 있어야 한다.

글이 길어질수록 들고 있을 게 산더미처럼 늘어난다.

그래서 트랜스포머는 한 번에 다룰 수 있는 글 길이를 늘리기가 어렵다.

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 단어가 늘면 저장할 이름표·내용도 그만큼 늘어남
memory = len(words) * (key_size + value_size)  # 길수록 무거움

한 문장 정의 — 단어마다 이름표·내용을 저장해야 해서, 글이 길어질수록 트랜스포머는 무거워진다.


2.4 트랜스포머 한 블록 안에는 뭐가 있나

트랜스포머는 똑같은 블록을 여러 층 쌓아 만든다.

블록 하나에는 두 부품이 들어 있다.

  • 어텐션 부품 — 방금 본 Q·K·V로 어디를 볼지 정함
  • MLP 부품(다층 퍼셉트론) — 본 내용을 한 번 더 버무려 패턴을 뽑음. 사이사이 단순한 '꺾기 함수'(ReLU 등)를 끼운다

한 걸음 더 ▸ (지금 몰라도 됨) — 왜 꺾기 함수가 단순할수록 좋을까? 모델엔 직선을 한 번 꺾어 줄 장치만 있으면 충분하다. 화려한 함수는 계산만 무겁고 더 똑똑해지진 않더라는 게 밝혀졌다. 단순한 게 빨라서 더 좋다.

블록을 몇 층 쌓았는지를 그 모델의 '레이어 수'라고 부른다.

층이 깊고 부품이 클수록 모델이 커진다.

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 같은 블록을 N 층 쌓음
model = [TransformerBlock() for _ in range(N)]  # N 이 곧 레이어 수

한 문장 정의 — 트랜스포머는 어텐션+MLP로 된 블록을 여러 층 쌓은 구조다.


2.5 답을 만드는 두 박자 — 읽기와 쓰기

트랜스포머가 답을 낼 때는 두 박자로 움직인다.

  • 읽기(프리필) — 입력을 한꺼번에 쭉 읽는다. 빠르다 (병렬).
  • 쓰기(디코드) — 답은 한 글자씩 차례로 쓴다. 느리다 (순차).
비유 코드 위험
문제지는 한눈에 훑고 read_all(input) # 한꺼번에
답안은 한 글자씩 적음 for _ in answer: write_one() 답이 길수록 느리고 비쌈

한 문장 정의 — 트랜스포머는 입력은 한꺼번에 읽고, 답은 한 글자씩 쓴다. 그래서 긴 답일수록 느리다.


2.6 트랜스포머 말고 다른 속은 없나

트랜스포머가 2017년부터 줄곧 대세지만, 도전자도 있다.

  • RWKV — RNN을 병렬로 학습하게 손본 것. 이론상 글 길이 제한이 없다 (실제로 긴 글을 잘한다는 보장은 별개).
  • 맘바(Mamba) — 긴 글 다루기에 강하다. 같은 크기 트랜스포머보다 낫고, 글이 길어져도 부담이 천천히 는다(트랜스포머는 제곱으로 확 늘어난다).
  • 잠바(Jamba) — 트랜스포머와 맘바를 번갈아 쌓은 혼합형. 메모리를 덜 쓰면서 긴 글을 잘 본다.

다만 트랜스포머는 2017년부터 갈고닦여서, 이걸 넘어서는 새 구조를 만들기는 쉽지 않다.

한 문장 정의 — 트랜스포머가 지배적이지만 맘바·잠바 같은 도전자가 등장 중이며, 특히 긴 글 처리에서 가능성을 보인다.


3. 모델 크기 이야기 — 숫자 세 개

3.1 크기를 말하는 세 숫자

"이 모델 13B래" 할 때 그 숫자가 뭘 뜻하는지 보자.

숫자 비유
파라미터 수 모델의 '머리 용량' (예: 라마-13B = 130억 개) 라디오 다이얼 개수 (0장 참고)
학습 토큰 수 얼마나 많이 읽었나 읽은 책 권수
FLOPs 수 학습에 든 계산량 = 비용 들인 전기요금

라마는 점점 더 많이 읽었다. 라마1은 1.4조 토큰, 라마2는 2조, 라마3는 15조 토큰.

파라미터로 메모리 어림하기 (예시 폭격)

예시 ① — 70억(7B) 파라미터 모델, 한 개당 2바이트면 → 약 14GB GPU 메모리가 필요하다.

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
gpu_memory = 7_000_000_000 * 2  # = 14GB (최소치)

예시 ② — 빈칸: 파라미터가 2배면 필요한 메모리도 대략 ___ 배. 정답: 2배.

한 문장 정의 — 모델 크기는 파라미터 수(용량)·학습 토큰 수(읽은 양)·FLOPs(비용) 세 숫자로 말한다.


3.2 전문가 여럿을 두되 한 명만 부른다 — MoE

아이디어

파라미터가 많으면 똑똑하지만 무겁다.

그런데 전문가 혼합(MoE) 은 영리하다.

전문가를 여럿 두되, 질문 하나엔 그중 몇 명만 깨워 쓴다.

예시 폭격 — 믹스트랄 8x7B

전문가 8명, 총 467억 파라미터.

하지만 질문 하나엔 8명 중 2명만 깬다 → 실제로는 129억 파라미터만 일한다.

즉 큰 모델을 들고 있으면서, 비용·속도는 작은 모델처럼 쓴다.

비유 코드 위험
전문가 8명 중 2명만 호출 experts[8] 보유, 호출은 pick(2) 전체 크기만 보면 비용을 오해함

한 문장 정의 — MoE는 전문가를 여럿 두되 매번 일부만 깨워, 큰 모델을 작은 비용으로 쓰는 방식이다.


3.3 예산에 맞는 최적 크기 — 친칠라 규칙

망가지는 장면

"돈은 정해졌는데, 모델을 얼마나 크게, 데이터를 얼마나 많이 넣어야 가장 좋을까?"

무작정 키우면 돈이 터진다.

딥마인드가 모델 400개를 실험해 답을 찾았다 (친칠라 규칙, 2022).

핵심 한 줄: 읽을 토큰 수 = 파라미터 수 × 20.

비유 코드 위험
그릇 크기에 맞게 밥 양 정하기 tokens = params * 20 모델만 키우고 데이터 안 늘리면 헛똑똑이

예시 폭격

예시 ① (완성예) — 30억 파라미터 모델 → 30억 × 20 = 600억 토큰을 읽혀야 균형이 맞는다.

예시 ② (부분완성) — 빈칸: 10억 파라미터 모델은 약 ___ 토큰. 정답: 200억 (10억 × 20).

다만 이 규칙은 '학습 비용'만 최적으로 맞춘다.

라마는 일부러 규칙보다 작게 만들었다. 작아야 나중에 쓸 때 싸고 다루기 쉬워서다.

한 문장 정의 — 친칠라 규칙은 정해진 예산에서 토큰을 파라미터의 약 20배 읽히는 게 균형이라고 말한다.


3.4 더 못 키우게 막는 벽 두 개

지금까진 크게 만들수록 좋았다. 그런데 곧 벽에 부딪힌다.

벽 ① — 데이터 부족. 모델이 글을 먹는 속도가 새 글이 생기는 속도보다 빠르다. 게다가 레딧·스택오버플로 같은 곳이 "우리 글 긁어가지 마"로 약관을 바꿔서, 인기 데이터 C4의 상당 부분이 막혔다.

벽 ② — 전기 부족. 데이터센터가 이미 전 세계 전기의 1~2%를 먹는다. 2030년엔 4~20%까지 갈 수 있다.

# 데이터·전기가 모자라면 더 못 키움
# 조건을 확인해서 상황에 맞는 처리 경로를 고릅니다.
if not enough(data) or not enough(power):
    # 준비한 함수나 객체를 호출해 예제의 핵심 동작을 실행합니다.
    scaling.stop()

한 걸음 더 ▸ (지금 몰라도 됨) — AI가 만든 글로 새 AI를 또 학습시키면 성능이 점점 망가질 수 있다는 '모델 붕괴' 걱정도 있다. 지금은 "데이터와 전기가 한계"만 알면 된다.

한 문장 정의 — 모델 키우기를 막는 두 벽은 학습할 데이터 고갈과 전기 부족이다.


4. 어떻게 다듬었나 — 사후 학습

4.1 갓 배운 모델의 두 가지 문제

망가지는 장면

인터넷 글로 막 학습을 마친 모델에게 "피자 만드는 법"이라고 입력한다.

답을 안 한다. 대신 "여섯 식구를 위한?" 하고 문장을 이어 쓴다.

왜? 이 모델은 '대화'가 아니라 '글 이어 붙이기'만 배웠기 때문이다. (0장 척추 1 참고)

문제 ① — 대화가 아니라 완성을 한다.

문제 ② — 인터넷 흙탕물을 먹어서, 혐오·차별·거짓을 그대로 뱉을 수 있다.

이 둘을 고치는 단계가 사후 학습(이 장 새 단어 참고)이다.

비유 코드 위험
책만 읽은 신입 — 응대 못함 raw.ask("피자 만드는 법") → 문장만 이어 씀 그냥 쓰면 거칠고 위험함

사후 학습은 두 단계로 다듬는다. 4.2와 4.3에서 본다.

참고로 다듬는 데 드는 계산은 처음 학습의 약 2%뿐이다 (적은 손질로 큰 효과).

한 문장 정의 — 갓 배운 모델은 대화를 못 하고 거칠어서, 사후 학습으로 두 번 다듬는다.


4.2 1단계 — 좋은 답을 보여 주며 가르치기 (SFT)

비유 먼저

운전 가르치기. 옆에서 "이럴 땐 이렇게" 모범을 보여 주면, 배우는 사람이 그걸 따라 한다.

모델도 똑같다. (질문, 좋은 답) 짝을 잔뜩 보여 주면 그 패턴을 따라 한다.

이걸 SFT(지도 파인튜닝) 또는 '행동 복제'라고 한다.

비유 코드 위험
모범 답안 보여 주고 따라하게 model.learn([(질문, 좋은답), ...]) 답을 만드는 사람(레이블러)이 똑똑해야 함

예시 폭격 — 이거 비싸다

예시 ① — 좋은 답을 쓰는 사람(레이블러)은 아무나 안 된다. 인스트럭트GPT 작업자의 약 90%가 대학 졸업 이상, 3분의 1이 석사였다.

예시 ② — (질문, 답) 한 짝에 약 10달러. 1만 3천 짝이면 약 13만 달러. 비싸다.

예시 ③ — 돈 없는 곳은 자원봉사로 모은다(LAION). 하지만 봉사자의 90%가 남성이라 편향이 생겼다.

한 문장 정의 — SFT는 (질문, 좋은 답) 모범을 보여 주며 대화법을 가르치는 1단계다.


4.3 2단계 — 둘 중 뭐가 더 나은지 고르게 하기 (선호도 파인튜닝)

망가지는 장면

SFT는 '대화하는 법'은 가르치지만 '어떤 대화가 좋은지'는 안 가르친다.

누가 나쁜 글을 써달라고 하면? 사람마다 '좋은 답' 기준도 다르다.

그래서 2단계가 필요하다.

핵심 요령 — 점수 대신 비교

"이 답 몇 점?"이라고 물으면 사람마다 들쭉날쭉하다.

"A랑 B 중 뭐가 더 나아?"라고 물으면 훨씬 일관된다.

그래서 (질문, 더 나은 답, 못한 답) 짝을 모은다.

방법 한마디로 쓰는 곳
RLHF '심판 모델'을 따로 만들어 점수 매김. 복잡하지만 유연 인스트럭트GPT, 라마2
DPO 심판 없이 비교 데이터로 바로 학습. 단순 라마3
RLAIF 사람 대신 AI가 비교를 판단 클로드(Claude)

메타는 복잡한 RLHF(라마2)에서 단순한 DPO(라마3)로 갈아탔다.

비유 코드 위험
둘 중 나은 걸 고르게 함 learn([(질문, 나은답, 못한답), ...]) '보편적 좋음'을 수식 하나로 못 담음

한 걸음 더 ▸ (지금 몰라도 됨) — 판단이 생성보다 쉬워서, 약한 모델도 강한 모델의 답을 채점할 수 있다. 강화 학습 없이 심판 점수 높은 답만 골라 쓰는 'Best of N' 방식만 쓰는 회사도 있다(스티치 픽스, 그랩).

한 문장 정의 — 2단계는 '점수' 대신 '둘 중 비교'로 사람 취향을 가르친다. RLHF·DPO·RLAIF가 그 방법이다.


5. 답을 어떻게 고르나 — 샘플링

5.1 모델은 답을 '뽑는다'

기본 장면

모델은 다음 단어를 딱 정해 두지 않는다.

후보 단어마다 확률을 매기고, 그중에서 뽑는다.

"내가 좋아하는 색은 ___"에서 green 50%, red 30% 식으로 확률이 매겨지면, green이 절반 확률로 뽑힌다.

(엄밀히는 신경망이 '로짓'이라는 원점수를 내고, 소프트맥스라는 계산으로 확률로 바꾼다. 분위기만 알면 된다.)

왜 매번 가장 높은 것만 안 고를까?

항상 1등만 고르면(그리디) 답이 지루해진다.

늘 가장 흔한 단어만 나오니, 다섯 살 아이 말투가 된다.

비유 코드 위험
가중치 다른 제비뽑기 pick(green=0.5, red=0.3) 매번 답이 달라질 수 있음

한 문장 정의 — 모델은 후보 단어의 확률을 매겨 뽑으며, 이 뽑기가 창의성도 비일관성도 만든다.


5.2 온도 — 뻔함과 엉뚱함 조절

비유 먼저

온도(이 장 새 단어 참고)는 손잡이 하나다.

낮추면 늘 가장 무난한 답(뻔함), 높이면 가끔 튀는 답(엉뚱함).

예시 폭격

예시 ① (완성예) — 후보 A, B의 원점수가 [1, 2]일 때: 온도 1.0 → 확률 [0.27, 0.73] 온도 0.5 → 확률 [0.12, 0.88] (B 쪽으로 더 쏠림 = 더 뻔해짐)

예시 ② (부분완성) — 빈칸: 코드 생성·의료처럼 정확함이 중요하면 온도를 ___ 게. 정답: 낮게.

온도 효과 어디 쓰나
낮음 (<1) 무난하고 일관됨 코드 생성, 의료 보조
높음 (>1) 다양하고 창의적 광고 카피, 소설 초안
0에 가까움 늘 1등만 (그리디) 일관성 최우선

창의 작업엔 보통 0.7을 권한다. 업체들은 대개 0~2 범위로 막아 둔다.

비유 코드 위험
주사위에 손대기 ask(..., temperature=0.2) 뻔함 너무 높이면 헛소리 늘어남

한 문장 정의 — 온도는 답을 뻔하게(낮음) 또는 엉뚱하게(높음) 만드는 손잡이다.


5.3 top-k와 top-p — 후보를 몇 개만 추리기

후보 단어가 너무 많으면 계산이 무겁다.

그래서 후보를 추린다. 두 방식이 있다.

top-k — 개수로 자르기

"상위 k개(예: 50개)만 후보로 두자." 개수가 고정이다.

top-p — 누적 확률로 자르기

"확률 높은 것부터 더해서 90%(p) 채울 만큼만 후보로 두자." 개수가 상황 따라 변한다.

예시 폭격 — top-p

후보가 yes 60%, maybe 31%, no 8%일 때: top-p=0.9 → yes+maybe(91%)까지만 고려 top-p=0.99 → no까지 고려

"예/아니오" 질문엔 자연히 후보가 적어지고, 열린 질문엔 많아진다. 똑똑하다.

구분 top-k top-p
자르는 기준 개수 k개 고정 누적 확률 p까지
쉬운 질문 그래도 k개 자연히 적어짐
권장값 50~500 0.9~0.95
비유 코드 위험
상위 N명만 후보 (top-k) pick(top_k=50) 질문 난이도와 무관하게 고정
90% 채울 만큼만 (top-p) pick(top_p=0.9) 계산 부담이 꼭 줄진 않음

언제 멈출까 (중단 조건) — 토큰 수 한도나 '끝 신호 토큰'으로 멈춘다. 너무 일찍 끊기면 JSON 닫는 괄호가 빠지는 사고가 난다.

한 문장 정의 — top-k는 후보를 개수로, top-p는 누적 확률로 추려 적당히 다양하게 만든다.


5.4 여러 번 뽑아 제일 나은 걸 고르기 — 테스트 시점 연산

아이디어

답을 한 번만 뽑지 말고, 여러 번 뽑아서 제일 나은 걸 고르자.

이걸 테스트 시점 연산(Best of N)이라 한다.

제일 나은 걸 고르는 법 (예시 폭격)

  • 가장 확률 높은 답 고르기 (오픈AI의 best_of)
  • 심판 모델 점수로 고르기
  • 다수결 — 수학·객관식에 좋다. 구글은 시험 볼 때 문제당 32번 풀려 가장 많이 나온 답을 택했다
  • 더 짧은 답, 또는 유효한 SQL만 고르기

효과가 얼마나?

심판을 써서 고르는 게, 모델을 30배 키운 것과 맞먹는 성능을 냈다 (오픈AI, Cobbe et al., 2021).

단, 끝없이 늘리면 안 된다. 오픈AI 실험에선 400개까지만 좋아지고 그 뒤엔 오히려 심판을 속이는 답이 늘었다.

비유 코드 위험
여러 개 써 보고 best 고르기 outs = [gen() for _ in range(N)]; pick_best(outs) N 만큼 비용도 늘어남

예시 폭격 ② — 흐릿한 이미지에서 글자를 읽을 때, 한 번에 절반밖에 못 읽던 걸 세 번 시도하니 거의 다 읽었다.

한 문장 정의 — 테스트 시점 연산은 답을 여러 번 뽑아 제일 나은 걸 골라 품질을 올리는 방법이다.


5.5 정해진 형식으로 뽑게 하기 — 구조화 출력

망가지는 장면

답을 다음 프로그램에 넘겨야 하는데, 모델이 JSON을 삐뚤게 뱉어 파싱이 깨진다.

JSON·SQL처럼 정해진 형식이 꼭 필요한 일이 있다.

형식을 지키게 만드는 5가지 (가벼운 것 → 강한 것)

방법 한마디로 효과
프롬프팅 "JSON으로 줘"라고 시킴. 단순·저비용 낮음~중간
후처리 모델이 자주 하는 실수를 스크립트로 교정. 링크드인은 이걸로 90%→99.99% 중간
테스트 시점 연산 형식 맞을 때까지 다시 뽑기 중간
제약 샘플링 형식에 맞는 단어만 뽑게 강제. 강하지만 형식마다 문법 필요 높음
파인튜닝 원하는 형식 예시로 모델을 아예 가르침 가장 높음
비유 코드 위험
"양식에 맞춰 적어줘" 부탁 (프롬프팅) ask("JSON 으로 답해") 안 지킬 수 있음
틀린 칸만 손으로 고침 (후처리) fix_missing_bracket(output) 쉬운 실수만 고침

예시 폭격 — 빈칸: 가장 단순하지만 가장 안 미더운 방법은 ___. 정답: 프롬프팅.

한 문장 정의 — 구조화 출력은 프롬프팅→후처리→제약 샘플링→파인튜닝 순으로 형식을 점점 강하게 강제한다.


6. 확률적이라 생기는 두 골칫거리 — 비일관성과 환각

6.1 같은 질문, 다른 답 — 비일관성

망가지는 장면

같은 글을 챗GPT에 두 번 채점시켰는데, 한 번은 3/5, 한 번은 5/5가 나왔다.

뽑기로 답을 고르니, 같은 질문에도 답이 달라진다.

두 모습이 있다.

① 같은 입력 → 다른 답.

② 살짝 다른 입력(대문자 하나 차이) → 완전히 다른 답.

달래는 법 (예시 폭격)

예시 ① — 같은 답을 저장해 두고 재사용(캐싱), 온도·top-p·top-k·시드 고정.

예시 ② — 단, 100%는 못 막는다. 하드웨어가 다르면 결과도 미세하게 달라진다.

# 변수 고정으로 일관성을 높임 (완벽 보장은 아님)
# `ask(..., temperature`에 중간 결과를 담아 다음 줄에서 재사용합니다.
ask(..., temperature=0, seed=42)
비유 코드 위험
만날 때마다 이름 다르게 말하는 사람 ask(q) 두 번 → 다른 답 사용자 신뢰가 깨짐

한 문장 정의 — 뽑기 때문에 같은 질문에도 답이 달라지며, 변수 고정으로 줄이되 완전히는 못 막는다.


6.2 그럴듯한 거짓말 — 환각

환각(0장 용어집 참고)은 사실 아닌 걸 그럴듯하게 지어내는 현상이다.

2023년 6월, 한 로펌이 챗GPT가 지어낸 가짜 판례를 법원에 냈다가 벌금을 물었다.

환각이 왜 생기는지 두 가설이 있다.

가설 1 — 자기 기만 (딥마인드)

모델은 자기가 방금 한 말을 '주어진 사실'처럼 믿어 버린다.

"칩 후옌은 건축가다"라고 한 번 뱉으면, 그 다음부턴 그걸 사실로 깔고 더 지어낸다.

잘못된 첫 단추가 눈덩이처럼 불어난다.

예시 — GPT-4가 "9677 = 13 × 745(틀림)"라고 한 번 말한 뒤, 9677이 13으로 안 나뉜다는 걸 알면서도 처음 주장을 끝까지 우겼다.

가설 2 — 아는 것의 어긋남 (오픈AI)

SFT 때 작업자가 '모델은 모르는 지식'으로 답을 쓰면, 모델은 그걸 따라 하다 사실상 '지어내기'를 배운다.

구분 자기 기만 아는 것의 어긋남
언제 생기나 처음 학습 때 SFT 때
원인 자기 말을 사실로 믿음 작업자 지식 > 모델 지식
달래는 법 내 말과 주어진 사실 구분하게 학습 답에 출처 찾게 시키기, 지어내면 벌점

실무에서 줄이는 법 (예시 폭격)

예시 ① — "확실히 모르면 '모르겠습니다'라고 해" 프롬프트.

예시 ② — 답을 짧게 시키기 (지어낼 토큰이 적어짐).

비유 코드 위험
모르면서 아는 척 술술 ask("관련 판례?") → 없는 사건 만듦 사실 작업에선 치명적

한 걸음 더 ▸ (지금 몰라도 됨) — 흥미롭게도 RLHF가 환각을 오히려 늘렸다는 결과도 있다. 그래도 다른 면이 좋아져서 사람들은 RLHF 모델을 더 선호했다. 두 가설은 서로 보완적이다 — 하나는 처음 학습이, 다른 하나는 SFT가 환각을 만든다고 본다.

한 문장 정의 — 환각은 모델이 사실 아닌 걸 지어내는 현상이며, 자기 기만과 아는 것의 어긋남 두 가설로 설명된다.


정리

이 장의 네 줄기를 한 줄씩.

  • 데이터 — 모델은 배운 것만 한다. 인터넷은 영어 절반이라 영어를 제일 잘하고, 데이터 적은 언어는 못한다.
  • 속(아키텍처) — 요즘 모델 속은 트랜스포머. 심장은 어텐션 하나. 단점은 긴 글이 무겁다는 것.
  • 다듬기(사후 학습) — 갓 배운 모델은 거칠다. 좋은 답 보여 주기(SFT) → 둘 중 비교(선호도)로 두 번 다듬는다.
  • 뽑기(샘플링) — 답은 확률로 뽑는다. 온도·top-k·top-p로 조절. 이 뽑기가 창의성도, 비일관성·환각도 만든다.

다음 3장 예고 1줄. 잘 만들었는지 채점하는 일(평가)을 본다. (지금 몰라도 됩니다 — 3장에서 풀려요.)


연습문제

  1. 설명. 거대 모델은 어떻게 만들어지나의 핵심을 처음 듣는 사람에게 한 문장으로 설명하라.
  2. 구분. 두 개념(사전 학습, 사후 학습)을 실제 예시 하나로 구분하라.
  3. 적용. 내 프로젝트나 학습 노트에서 이 장의 개념을 적용해 작게 개선할 지점을 하나 고르라.

부록 A. 쉬운 용어 사전

용어 아주 쉬운 뜻 이 장에서 나온 위치
사전 학습 큰 모델이 기본 언어 능력과 패턴을 배우는 첫 학습 단계. 부록 B와 본문 예시
사후 학습 사전 학습 뒤 사람 지시와 안전 기준에 맞게 다듬는 단계. 부록 B와 본문 예시
샘플링 여러 가능한 다음 단어 중 하나를 고르는 답변 생성 방식. 부록 B와 본문 예시
결정적 출력 같은 입력이면 되도록 같은 답을 내도록 설정한 출력 방식. 부록 B와 본문 예시

부록 B. 헷갈리는 개념 비교표

A B 구분 포인트
사전 학습 사후 학습 사전 학습은 기본 능력 만들기, 사후 학습은 사람 지시에 맞게 다듬기다.
샘플링 결정적 출력 샘플링은 여러 가능성 중 고르고, 결정적 출력은 같은 입력에 같은 답을 노린다.

부록 C. 더 읽을 자료

  • 이 장의 더 해보기 섹션 — 이미 모아 둔 공식 문서나 실습 링크가 있으면 여기서 먼저 확인한다.
  • 같은 책의 0장 한눈에 보기 — 용어가 막히면 0장의 용어집과 개념 척추로 돌아간다.
  • 원본 딥다이브판 같은 장 — 입문판을 읽고 큰 흐름이 잡힌 뒤 세부 논리를 더 깊게 확인한다.
  • 이 장의 flashcards.json — 읽은 직후 질문만 보고 답을 떠올리는 회상 연습에 쓴다.

부록 D. 연습문제 풀이

  1. 설명 예시. 거대 모델은 어떻게 만들어지나는 거대 모델을 제품에 넣을 때 어떤 선택을 하고 어떻게 확인할지 판단하게 해 주는 장이다. 중요한 것은 용어를 외우는 것이 아니라, 이 개념이 어떤 입력·부품·결정에 영향을 주는지 말로 풀어 보는 것이다.
  2. 구분 예시. 두 개념(사전 학습, 사후 학습)의 차이는 이렇게 잡으면 된다. 사전 학습은 기본 능력 만들기, 사후 학습은 사람 지시에 맞게 다듬기다. 실제 사례를 볼 때는 목적, 입력, 실패했을 때의 증상을 따로 적어 보면 헷갈리지 않는다.
  3. 적용 예시. 가장 작은 개선부터 고른다. 예를 들어 이름을 더 분명히 하거나, 평가 기준을 한 줄 추가하거나, 직접 알 필요 없는 내부 정보를 감추는 식으로 시작한다. 한 번에 크게 갈아엎는 것보다 작은 변경 하나를 확인하며 진행하는 쪽이 입문 단계에 맞다.
난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플